Come integrare modulo e script nello stesso file e gestione degli errori.

Nelle precedenti lezioni, quando abbiamo creato un interazione tra HTML e PHP, abbiamo sempre utilizzato due file distinti e separati. Un primo file contenente l'interfaccia utente per l'inserimento dei dati (il modulo) ed un secondo file contenente lo script PHP per la manipolazione dei dati contenuti nello stesso.
In questa lezione vedremo come possiamo aggregare in un solo file sia il modulo che lo script tramite una variabile d'ambiente chiamata PHP_SELF inserita nell'attributo ACTION del modulo.
Apriamo il Blocco Note (o Notepad) di Windows e cominciamo a scrivere il nostro unico file come segue:

<html><head><title>Modulo completo</title></head>
<body>
<?
  $blocco_modulo = "

      <form method=\"post\" action=\"$PHP_SELF\">

      <p><b>Tuo nome:</b><br><input type=\"text\" name=\"nome\" size=30>
      <p><b>Tua e-mail:</b><br><input type=\"text\" name=\"email\" size=30>
      <p><b>Messaggio:</b><br>
      <textarea name=\"messaggio\" cols=30 rows=5 wrap=virtual></textarea>

      <p><input type=\"submit\" name=\"Invio\" value=\"Invia il modulo\">

      </form>   "; ?>

Fino ad ora avevamo visto che, al momento di inviare i dati del modulo, il server cercava sempre un'altro file che contenesse lo script di manipolazione dei dati; adesso invece, con la variabile PHP_SELF inserita nel modulo, ricaricherà la stessa pagina nel browser.
Questa metodologia di programmazione ci permette, inoltre, di inserire il controllo degli errori nel modulo stesso tramite degli accorgimenti che adesso andremo a spiegare:
All'interno della variabile $blocco_modulo, che contiene il nostro modulo da ricaricare, prima del codice HTML per il pulsante di invio creeremo una variabile nascosta, che chiameremo con (abbreviazione di "controllo"), il cui valore sarà ok. A questo punto scriviamo anche il codice per il controllo degli errori ed il nostro modulo avrà queste sembianze:

<html><head><title>Modulo completo</title></head>
<body>
<?
  $blocco_modulo = "

      <form method=\"post\" action=\"$PHP_SELF\">

      <p><b>Tuo nome:</b><br><input type=\"text\" name=\"nome\" value=\"$nome"\ size=30>
      <p><b>Tua e-mail:</b><br><input type=\"text\" name=\"email\" value=\"$email"\ size=30>
      <p><b>Messaggio:</b><br>
      <textarea name=\"messaggio\" cols=30 rows=5 wrap=virtual>$messaggio</textarea>

      <input type=\"hidden\" name=\"con\" value=\"ok\">

      <p><input type=\"submit\" name=\"Invio\" value=\"Invia il modulo\">

      </form>  ";

     if ($con != "ok") { echo "$blocco_modulo"; }
      else if ($con == "ok")
           {
               if ($nome == "")
                 { $err_nome = "<font color=red>Attenzione! non hai digitato il tuo nome.</font><br>";
                    $invia = "no"; }

               if ($email == "")
                 { $err_email = "<font color=red>Attenzione! non hai digitato la e-mail.</font><br>";
                    $invia = "no"; }

               if ($messaggio == "")
                 { $err_messaggio = "<font color=red>Attenzione! non è contenuto alcun messaggio.</font><br>";
                   $invia = "no"; }

      if ($invia != "no")
        {
          $dest = tu@latuaemail.it";
          $ogg = "Messaggio dal sito";
          $int_mail = "From: miosito.it \n";
          $int_mail .= "Reply to: $email\n\n";

          $msg = "E-mail inviata dal mio sito.\n";
          $msg . = "Nome: $nome\n";
          $msg . = "E-mail: $email\n";
          $msg . = "Messaggio\n $messaggio\n\n";

          mail($dest, $ogg, $msg, $int_mail);

          echo "<p>L'email è stata inviata!";
         }
       else if ($invia == "no")
          {
            echo "<font color=red>Attenzione, hai commesso i seguenti errori:</font><br>";
            echo "$err_nome";
            echo "$err_email";
            echo "$err_messaggio";
            echo "$blocco_modulo";
          }
        }
   ?>
</body>
</html>

Malgrado la lunghezza del listato avrete notato senz'altro alcune modifiche che ci permettono di non perdere i dati in caso di debugging continuo del nostro programma. Infatti all'interno dei moduli sono stati inseriti gli attributi value che permettono la conservazione dei valori inseriti dall'utente. Inoltre potete notare che l'ultimo controllo del listato, nel caso anche di un solo errore, manda in uscita tutti i messaggi d'errore i quali, però, se non verificati in fase di controllo precedente non verranno stampati. Può però succedere che, nel mancato verificarsi di un errore, il browser mandi in stampa dei messaggi di tipo "Warning"; per eliminare questo inconveniente basta aprire il file php.ini contenuto in C:/WINDOWS (o C:/WINNT) e settare la variabile display_errors uguale a Off.
Adesso salvate il file con il nome modulo_completo.php ed eseguite digitando sulla barra degli indirizzi del browser http://localhost/modulo_completo.php.